package logica;

import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Mariano Zapata
 */
public class Verificador {
    
    public static final int ERROR_PUERTO_RMI_REMOTO= 0;
    public static final int ERROR_CARPETA_NOMBRE= 1;
    public static final int ERROR_CLIENTE_DNI= 2;
    public static final int ERROR_CLIENTE_APELLIDO= 3;
    public static final int ERROR_CLIENTE_NOMBRE= 4;
    public static final int ERROR_CLIENTE_FECHA_NACIMIENTO= 5;
    public static final int ERROR_CLIENTE_TELEFONO_MOVIL= 6;
    public static final int ERROR_CLIENTE_EMAIL= 7;
    public static final int ERROR_CLIENTE_DOMICILIO_DIRECCION= 8;
    public static final int ERROR_CLIENTE_DOMICILIO_CIUDAD= 9;
    public static final int ERROR_CLIENTE_DOMICILIO_PROVINCIA= 10;
    public static final int ERROR_CLIENTE_DOMICILIO_CODIGO_POSTAL= 11;
    public static final int ERROR_CLIENTE_DOMICILIO_TELEFONO= 12;
    public static final int ERROR_CLIENTE_TRABAJO_NOMBRE= 13;
    public static final int ERROR_CLIENTE_TRABAJO_PUESTO= 14;
    public static final int ERROR_CLIENTE_TRABAJO_DIRECCION= 15;
    public static final int ERROR_CLIENTE_TRABAJO_CIUDAD= 16;
    public static final int ERROR_CLIENTE_TRABAJO_PROVINCIA= 17;
    public static final int ERROR_CLIENTE_TRABAJO_CODIGO_POSTAL= 18;
    public static final int ERROR_CLIENTE_TRABAJO_TELEFONO= 19;
    public static final int ERROR_CLIENTE_TRABAJO_FAX= 20;
    public static final int ERROR_CLIENTE_TRABAJO_WEB= 21;
    public static final int ERROR_PUERTO_RMI_LOCAL= 22;
    public static final int ERROR_ARCHIVO_NOMBRE= 23;
    public static final int ERROR_EXPEDIENTE_JUZGADO= 24;
    public static final int ERROR_EXPEDIENTE_SECRETARIA= 25;
    public static final int ERROR_EXPEDIENTE_INICIADO= 26;
    public static final int ERROR_EXPEDIENTE_TERMINADO= 27;
        
    //IP NO SE VALIDA PORQUE PUEDE SER UN DNS TAMBIÉN.
    public static void verificarPuertos(String puertoRMIRemoto, String puertoRMILocal) throws VerificadorException
    {
        List<Integer> errores= new ArrayList<Integer>();
        if (!esNumeroPuerto(puertoRMIRemoto))
            errores.add(ERROR_PUERTO_RMI_REMOTO);
        if (!esNumeroPuerto(puertoRMILocal))
            errores.add(ERROR_PUERTO_RMI_LOCAL);
        if (!errores.isEmpty())
            throw new VerificadorException(errores);
    }
    
    public static void verificarDni(String dni) throws VerificadorException
    {
        List<Integer> errores= new ArrayList<Integer>();
        if (!esNumeroPositivo(dni))
            errores.add(ERROR_CLIENTE_DNI);
        if (!errores.isEmpty())
            throw new VerificadorException(errores);
    }
    
    public static void verificarCarpeta(boolean esExpediente, String nombre, String juzgado, String secretaria)
            throws VerificadorException
    {
        List<Integer> errores= new ArrayList<Integer>();
        int tam= nombre.length();
        if (tam == 0 || tam > 200)
            errores.add(ERROR_CARPETA_NOMBRE);
        if (esExpediente)
        {
            tam= juzgado.length();
            if (tam == 0 || tam > 50)
                errores.add(ERROR_EXPEDIENTE_JUZGADO);
            tam= secretaria.length();
            if (tam == 0 || tam > 50)
                errores.add(ERROR_EXPEDIENTE_SECRETARIA);
        }
        if (!errores.isEmpty())
            throw new VerificadorException(errores);
    }

    public static void verificarCarpeta(String nombre, String juzgado, String secretaria, String iniciado,
            String terminado) throws VerificadorException
    {
        List<Integer> errores= new ArrayList<Integer>();
        int tam= nombre.length();
        if (tam == 0 || tam > 200)
            errores.add(ERROR_CARPETA_NOMBRE);
        tam= juzgado.length();
        if (tam == 0 || tam > 50)
            errores.add(ERROR_EXPEDIENTE_JUZGADO);
        tam= secretaria.length();
        if (tam == 0 || tam > 50)
            errores.add(ERROR_EXPEDIENTE_SECRETARIA);
        if (!iniciado.isEmpty())
        {
            try {
                iniciado= validarYArreglarFecha(iniciado);
            } catch (ParseException ex) {errores.add(ERROR_EXPEDIENTE_INICIADO);}
        }
        if (!terminado.isEmpty())
        {
            try {
                terminado= validarYArreglarFecha(terminado);
            } catch (ParseException ex) {errores.add(ERROR_EXPEDIENTE_TERMINADO);}
        }
        if (!errores.isEmpty())
            throw new VerificadorException(errores);
    }
    
    public static void verificarArchivo(String nombre) throws VerificadorException
    {
        List<Integer> errores= new ArrayList<Integer>();
        int tam= nombre.length();
        if (tam == 0 || tam > 255 || contieneCaracteresProhibidos(nombre) || !nombre.contains("."))
            errores.add(ERROR_ARCHIVO_NOMBRE);
        if (!errores.isEmpty())
            throw new VerificadorException(errores);
    }
    
    public static void verificarCliente(String apellido, String nombre) throws VerificadorException
    {
        List<Integer> errores= new ArrayList<Integer>();
        int tam= apellido.length();
        if (tam == 0 || tam > 50)
            errores.add(ERROR_CLIENTE_APELLIDO);
        tam= nombre.length();
        if (tam == 0 || tam > 50)
            errores.add(ERROR_CLIENTE_NOMBRE);
        if (!errores.isEmpty())
            throw new VerificadorException(errores);
    }
    
    public static void verificarCliente(String apellido, String nombre, String dni, String fechaNacimiento,
            String telefonoMovil, String email, String domicilioDireccion, String domicilioCiudad,
            String domicilioProvincia, String domicilioCodigoPostal, String domicilioTelefono, String trabajoNombre,
            String trabajoPuesto, String trabajoDireccion, String trabajoCiudad, String trabajoProvincia,
            String trabajoCodigoPostal, String trabajoTelefono, String trabajoFax, String trabajoWeb)
            throws VerificadorException
    {
        List<Integer> errores= new ArrayList<Integer>();
        int tam= apellido.length();
        if (tam == 0 || tam > 50)
            errores.add(ERROR_CLIENTE_APELLIDO);
        tam= nombre.length();
        if (tam == 0 || tam > 50)
            errores.add(ERROR_CLIENTE_NOMBRE);
        if (!dni.isEmpty() && !esNumeroPositivo(dni))
            errores.add(ERROR_CLIENTE_DNI);
        if (!fechaNacimiento.isEmpty())
        {
            try {
                fechaNacimiento= validarYArreglarFecha(fechaNacimiento);
            } catch (ParseException ex) {errores.add(ERROR_CLIENTE_FECHA_NACIMIENTO);}
        }
        if (!esNumeroTelefono(telefonoMovil))
            errores.add(ERROR_CLIENTE_TELEFONO_MOVIL);
        if (!email.isEmpty())
        {
            if (email.length() > 50 || !esEmail(email))
                errores.add(ERROR_CLIENTE_EMAIL);
        }
        if (domicilioDireccion.length() > 50)
            errores.add(ERROR_CLIENTE_DOMICILIO_DIRECCION);
        if (domicilioCiudad.length() > 50)
            errores.add(ERROR_CLIENTE_DOMICILIO_CIUDAD);
        if (domicilioProvincia.length() > 50)
            errores.add(ERROR_CLIENTE_DOMICILIO_PROVINCIA);
        if (!domicilioCodigoPostal.isEmpty() && !esNumeroPositivo(domicilioCodigoPostal))
            errores.add(ERROR_CLIENTE_DOMICILIO_CODIGO_POSTAL);
        if (!esNumeroTelefono(domicilioTelefono))
            errores.add(ERROR_CLIENTE_DOMICILIO_TELEFONO);
        if (trabajoNombre.length() > 50)
            errores.add(ERROR_CLIENTE_TRABAJO_NOMBRE);
        if (trabajoPuesto.length() > 50)
            errores.add(ERROR_CLIENTE_TRABAJO_PUESTO);
        if (trabajoDireccion.length() > 50)
            errores.add(ERROR_CLIENTE_TRABAJO_DIRECCION);
        if (trabajoCiudad.length() > 50)
            errores.add(ERROR_CLIENTE_TRABAJO_CIUDAD);
        if (trabajoProvincia.length() > 50)
            errores.add(ERROR_CLIENTE_TRABAJO_PROVINCIA);
        if (!trabajoCodigoPostal.isEmpty() && !esNumeroPositivo(trabajoCodigoPostal))
            errores.add(ERROR_CLIENTE_TRABAJO_CODIGO_POSTAL);
        if (!esNumeroTelefono(trabajoTelefono))
            errores.add(ERROR_CLIENTE_TRABAJO_TELEFONO);
        if (!esNumeroTelefono(trabajoFax))
            errores.add(ERROR_CLIENTE_TRABAJO_FAX);
        if (!trabajoWeb.isEmpty())
        {
            if (trabajoWeb.length() > 50 || !esURL(trabajoWeb))
                errores.add(ERROR_CLIENTE_TRABAJO_WEB);
        }
        if (!errores.isEmpty())
            throw new VerificadorException(errores);
    }
    
    private static boolean esNumeroPositivo(String n)
    {
        try {
            if (Integer.parseInt(n) >=  0)
                return true;
            else
                return false;
        } catch (NumberFormatException ex) {return false;}
    }
    
    private static boolean esNumeroTelefono(String n) //PERMITE CADENA VACÍA.
    {
        int size= n.length();
        int blancos= 0;
        for (int k= 0; k < size; k++)
        {
            char c= n.charAt(k);
            if (!esNumeroPositivo(String.valueOf(c)))
            {
                if ((c == ' ') && (blancos == 0))
                    blancos+= 1;
                else
                    return false;
            }
        }
        return true;
    }
    
    private static String validarYArreglarFecha(String valor) throws ParseException
    {
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
        formato.setLenient(false);
        formato.parse(valor);
        String [] temp= valor.split("/");
        if (temp[2].length() != 4)
            throw new ParseException("Fecha incorrecta.", 0);
        else
        {
            if (temp[0].length() == 1)
                temp[0]= "0" + temp[0];
            if (temp[1].length() == 1)
                temp[1]= "0" + temp[1];
            return temp[0] + "/" + temp[1] + "/" + temp[2];
        }
    }
    
    private static boolean esEmail(String e)
    {
        Pattern pat= Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+([a-zA-Z]" +
                "{2,9}.)+[a-zA-Z]{2,3})$");
        Matcher mat= pat.matcher(e);
        return mat.find();
    }
    
    private static boolean esNumeroPuerto(String n)
    {
        if (esNumeroPositivo(n))
        {
            int numero= Integer.parseInt(n);
            if (numero >= 1025 && numero <= 65536)
                return true;
            else
                return false;
        }
        else
            return false;
    }
    
    private static boolean esURL(String u)
    {
        URL url;
        try {
            url= new URL(u);
            url.toURI();
            return true;
        } catch (MalformedURLException ex) {return false;}
          catch (URISyntaxException ex) {return false;}
    }
    
    private static boolean contieneCaracteresProhibidos(String nombre)
    {
        int len= nombre.length();
        for (int k= 0; k < len; k++)
        {
            char c= nombre.charAt(k);
            if (c == '/' || c == ':' || c == '"' || c == '|' || c == '=' || c == '<' || c == '>')
                return true;
        }
        return false;
    }
}
